package fifteenth.工厂设计模式;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Properties;

//在属性文件中使用apple和orange表示完整的包.类名称，这样在使用的时候直接通过属性名称即可
//属性操作类
class Init{ //在此类中的主要功能是取得属性文件中的配置信息，如果属性文件不存在，则创建一个新的，并设置默认值
    public static Properties getProperties() throws IOException {
        Properties pro = new Properties();
        File file = new File("D:\\WorkSpaces\\JavaDevelopBase_start_329\\src\\fifteenth\\工厂设计模式\\fruit.properties");
        if(file.exists()){  //如果属性文件已经存在
            pro.load(new FileInputStream(file));    //读取属性
        }else{
            //如果属性文件不存在 就新建一个属性文件，同时设置好默认内容
            pro.setProperty("banana","fifteenth.Banana");
            pro.setProperty("strawberry","fifteenth.Strawberry");
            pro.store(new FileOutputStream(file),"FRUIT CLASS");
        }
        return pro;
    }
}
public class 结合属性文件的工厂模式 {
    public static void main(String[] args) throws IOException, ClassNotFoundException, InstantiationException, IllegalAccessException {
        Properties pro = Init.getProperties();  //初始化属性类
        //通过工厂类获取接口实例
        Fruit fruit = (Fruit) Factory.getInstance(pro.getProperty("apple"));
        if(fruit!=null){
            fruit.eat();
        }
    }
}
/**
 * 再通过工厂类取得接口实例的时候，直接输入属性的key值就可以找到完整的包.类名称，以达到对象的实例化功能。
 * 在本程序中可以发现，程序很好地实现了代码于配置相分离，通过配置文件配置要使用的类，然后通过程序读取配置文件
 * 完成具体的功能。
 * 当然，这些程序完成前提是基于接口，所以接口在实际开发中用处是最大的。、
 * 程序 ---->  程序代码 --> 运行时读取属性文件，以找到相应的配置信息 --> 配置文件（保存程序运行的相关信息）
 *              配置文件 ---配置文件决定程序的运行-----> 程序代码
 */
/*
D:\WorkSpaces\Java\jdk-21\bin\java.exe "-javaagent:D:\Software\IntelliJ IDEA\IntelliJ IDEA 2023.3.2\lib\idea_rt.jar=50345:D:\Software\IntelliJ IDEA\IntelliJ IDEA 2023.3.2\bin" -Dfile.encoding=UTF-8 -Dsun.stdout.encoding=UTF-8 -Dsun.stderr.encoding=UTF-8 -classpath D:\WorkSpaces\JavaDevelopBase_start_329\out\production\JavaDevelopBase_start_329 fifteenth.工厂设计模式.结合属性文件的工厂模式
我爱吃香蕉！

Process finished with exit code 0

 */